#ifndef _ARC_
#define _ARC_

//#include <iostream>
#include <string>
#include <limits>
#include "structure.hpp"
#include "noeud.hpp"

/* -- Définition de la structure Arc --
struct Arc {
    int valeur;
    Noeud* src;
    Noeud* dst;
};
*/
using namespace std;

void initArc(Arc &a, int valeur = 0, bool verbose = false);
/* précond:     a non initialisé
 * postcond:    a initialisé, mais les champs Noeud source et Noeud destination ne sont pas renseignés
 */

void initArc(Arc &a, Noeud &src, Noeud &dst, int valeur = 0, bool verbose = false);
/* précond:     a non initialisé
 * postcond:    a initialisé, tous les champs sont renseignés
 */

void initArc(Arc &a, const Arc &copie, bool verbose = false);
/* précond:     a non initialisé
 * postcond:    a initialisé, les champs de a sont une copie des informations des champs de copie
 */

void afficherArc(Arc &a, bool verbose = false);

void copieArc(Arc &a, const Arc &copie, bool verbose = false);

int compArc(const Arc &a, const Arc &b, bool verbose = false);
/* précond  :   a et b initialisés
 * postcond :   renvoie un résultat en fonction de la valeur des arcs a et b :
 *              si a et b ont les mêmes sources et destination
 *                  - numeric_limits<int>::max()
 *              sinon
 *                  - < 0 : a < b
 *                  - 0 : a == b
 *                  - > 0 : a > b
 */

 int valeurArc (const Arc &a);

string sourceArc (const Arc &a);

string destinationArc (const Arc &a);

void testamentArc(Arc &a, bool verbose = false);
/* précond:     a initialisé
 * postcond:    les champs de a sont vides
 * Note :   Vu que l'arc est passé en référence, il n'y a pas de libération de l'espace mémoire pris par l'arc
 *          Il faut libérer l'arc dans la fonction ou la structure qui le requiert (si il y a eu allocation
 *          mémoire pour l'arc)
 */
#endif // _ARC_
